package io.renren.modules.upk.controller;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import io.renren.common.utils.PageUtils;
import io.renren.common.utils.R;
import io.renren.config.WxPayConfig;
import io.renren.modules.upk.entity.UpkGoodsEntity;
import io.renren.modules.upk.entity.UpkTradeOrderEntity;
import io.renren.modules.upk.service.UpkCartService;
import io.renren.modules.upk.service.UpkGoodsService;
import io.renren.modules.upk.service.UpkTradeOrderService;
import io.renren.modules.wxPay.entity.WxpayEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;



/**
 * 收订单列表，保存会员发生的交易订单。
 *
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2018-05-29 20:29:24
 */
@RestController
@RequestMapping("generator/upktradeorder")
public class UpkTradeOrderController {
    @Autowired
    private UpkTradeOrderService upkTradeOrderService;
    @Autowired
    private UpkCartService upkCartService;
    @Autowired
    private UpkGoodsService upkGoodsService;


    /**
     * 列表
     */
    @RequestMapping("/list")
//    @RequiresPermissions("upk:upktradeorder:list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = upkTradeOrderService.queryPage(params);
        if (page.getList()==null){
            page.getList();
        }
        return R.ok().put("page", page);
    }


    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
//    @RequiresPermissions("upk:upktradeorder:info")
    public R info(@PathVariable("id") Long id){
			UpkTradeOrderEntity upkTradeOrder = upkTradeOrderService.selectById(id);

        return R.ok().put("upkTradeOrder", upkTradeOrder);
    }
    /**
     * 保存
     */
    @RequestMapping("/save")
//    @RequiresPermissions("upk:upktradeorder:save")
    public R save(@RequestBody UpkTradeOrderEntity upkTradeOrder){
//        登陆流程
//        浏览流程
//        购买流程
//          挑选商品加入购物车
//          结算即下单流程（1.有購物車 把購物車内商品信息加入到訂單裏；2.沒有購物車 ）
//          支付流程
//        发货流程
//        收货流程
//                评价订单流程
        //訂單要素：购买人/付款方  购买的商品 商品数量  商品价格(内部查询)  ；物流信息
        //请求参数：userId   tradeGoodsId tradeSubGoodOrderId  收货地址ID
        //【验证用户的购买权限(限购(数量)，限时)， TODO
        // 验证地区物流限制，TODO
        // 特殊验证【必须某个积分或者卡卷购买，验证积分和卡卷】， TODO
        // 进行验证价格 废弃
        // 库存验证（即验证商品是否上架下架），
        // 安全验证(token【重发攻击】/md5/签名验签【跨域攻击CROS】) TODO
        // 查询商品价格/用户权限/营销活动（进行后端计算防止篡改；防止价格失效；）】 TODO
		//0.校验必填参数、特殊字符校验、长度校验等基本校验
        //1.据商品ID查询商品进行库存验证（即验证商品是否上架下架）
        UpkGoodsEntity upkGoodsEntity = upkGoodsService.selectById(upkTradeOrder.getTradeGoodsId());
        upkGoodsEntity.getGoodsNumber();
        //2.计算订单总价格
        BigDecimal multiply = upkGoodsEntity.getMarketPrice().multiply(new BigDecimal(upkTradeOrder.getTradeSubGoodOrderId()));
        upkTradeOrder.setGoodsAmount(multiply);
        //3.保存物流ID即setPayToolId
        //4.设置为待支付
        upkTradeOrder.setOrderStatus(1);//设置为待创建微信支付订单
        upkTradeOrderService.insert(upkTradeOrder);
        if (upkTradeOrder==null){
            return R.error();
        }else {
            upkTradeOrder.getBonusId();
            upkTradeOrder.getBalanceMoney();
            upkTradeOrder.getAddress();
            upkTradeOrder.getGoodsAmount();
            upkTradeOrderService.insert(upkTradeOrder);
        }
        //4.调用微信支付
        //4.1.调用小程序登录API
        upkTradeOrder.getId();
        //4.2.调用下单:返回前端并更新订单为2//设置为待创建微信支付订单成功
        try {
            Map<String, String> stringStringMap = wxPay();//TODO 进行返回
        }catch (Exception e){
            e.printStackTrace();
        }
        return R.ok();
    }




    private Map<String, String> wxPay() throws Exception {
        WxpayEntity wxpayEntity = new WxpayEntity();
        String notifyUrl = "";  //需要换成处理业务的回调接口

        WxPayConfig WxPayConfig = new WxPayConfig();
        WXPay wxPay = new WXPay(WxPayConfig);

        //根据微信支付api来设置
        Map<String, String> data = new HashMap<>();
        data.put("appid", WxPayConfig.getAppID());           //商户id
        data.put("mch_id", WxPayConfig.getMchID());         //商户号
        data.put("sub_appid",WxPayConfig.getAppID());     //小程序的APPID

        data.put("trade_type", "APP");                         //微信小程序支付
//        data.put("notify_url", notifyUrl);                     //回调地址
//        data.put("spbill_create_ip", "127.0.0.1");             //终端ip
//        data.put("total_fee", wxpayEntity.getTotalFee());       //订单总金额
//        data.put("fee_type", "CNY");                           //默认人民币
        data.put("transaction_id",wxpayEntity.getOutTradeNo()); //微信订单号
        data.put("out_trade_no", wxpayEntity.getOutTradeNo());   //商户订单号
        data.put("body", wxpayEntity.getBody());
        data.put("nonce_str", "");   // 随机字符串小于32位
        String s = WXPayUtil.generateSignature(data, WxPayConfig.getKey());  //签名
        data.put("sign", s);
//        wxPay.unifiedOrder这个方法中调用微信统一下单接口
        Map<String, String> respData = wxPay.unifiedOrder(data);
        if (respData.get("return_code").equals("SUCCESS")) {

            //返回给APP端的参数，APP端再调起支付接口
            Map<String, String> repData = new HashMap<>();
            repData.put("appid", WxPayConfig.getAppID());
            repData.put("partnerid", WxPayConfig.getMchID());
            repData.put("prepayid", respData.get("prepay_id"));
            repData.put("package", "WXPay");//数据包
            repData.put("noncestr", respData.get("nonce_str"));//随机串
            repData.put("timestamp", String.valueOf(System.currentTimeMillis() / 1000));//时间戳
            String sign = WXPayUtil.generateSignature(repData, WxPayConfig.getKey()); //签名
            respData.put("sign", sign);
            respData.put("timestamp", repData.get("timestamp"));
            respData.put("package", "WXPay");
            return respData;
        }
        throw new Exception(respData.get("return_msg"));
    }


    /**
     * 修改
     */
    @RequestMapping("/update")
//    @RequiresPermissions("upk:upktradeorder:update")
    public R update(@RequestBody UpkTradeOrderEntity upkTradeOrder){
			upkTradeOrderService.updateById(upkTradeOrder);

        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
//    @RequiresPermissions("upk:upktradeorder:delete")
    public R delete(@RequestBody Long[] ids){
			upkTradeOrderService.deleteBatchIds(Arrays.asList(ids));

        return R.ok();
    }

    public UpkCartService getUpkCartService() {
        return upkCartService;
    }

    public void setUpkCartService(UpkCartService upkCartService) {
        this.upkCartService = upkCartService;
    }

    public UpkGoodsService getUpkGoodsService() {
        return upkGoodsService;
    }

    public void setUpkGoodsService(UpkGoodsService upkGoodsService) {
        this.upkGoodsService = upkGoodsService;
    }
}
